!theme mono

skinparam classAttributeIconSize 0
skinparam classFontSize 12
skinparam classAttributeFontSize 11

title HealthSync 역설계 - Intelligence Service 데이터 설계서

package "Intelligence Service Database Schema" as intelligence_db #lightseagreen {

  entity "chat_sessions" as chat_session {
    * session_id : VARCHAR(50) <<PK>>
    --
    * user_id : VARCHAR(50)
    * status : VARCHAR(20)
    * created_at : TIMESTAMP
    * last_activity_at : TIMESTAMP
    * message_count : INTEGER
    * context : TEXT
    * session_type : VARCHAR(30)
    * expires_at : TIMESTAMP
    --
    + 인덱스: idx_user_id_status
    + 인덱스: idx_last_activity
    + 인덱스: idx_expires_at
  }

  entity "chat_messages" as chat_message {
    * message_id : VARCHAR(50) <<PK>>
    --
    * session_id : VARCHAR(50) <<FK>>
    * role : VARCHAR(20)
    * content : TEXT
    * timestamp : TIMESTAMP
    * message_order : INTEGER
    * is_sensitive : BOOLEAN
    * token_count : INTEGER
    * response_time_ms : INTEGER
    --
    + 인덱스: idx_session_order
    + 인덱스: idx_timestamp
    + 인덱스: idx_role
  }

  entity "analysis_results" as analysis_result {
    * id : BIGINT <<PK>>
    --
    * user_id : VARCHAR(50)
    * analysis_type : VARCHAR(50)
    * result : TEXT
    * confidence : DECIMAL(5,4)
    * created_at : TIMESTAMP
    * metadata : JSON
    * source_data_hash : VARCHAR(64)
    * claude_model_version : VARCHAR(20)
    * processing_time_ms : INTEGER
    --
    + 인덱스: idx_user_analysis_type
    + 인덱스: idx_created_at
    + 인덱스: idx_confidence
    + 인덱스: idx_source_hash
  }

  entity "notification_logs" as notification_log {
    * id : BIGINT <<PK>>
    --
    * user_id : VARCHAR(50)
    * mission_id : VARCHAR(50)
    * notification_type : VARCHAR(30)
    * message : TEXT
    * sent_at : TIMESTAMP
    * delivery_status : VARCHAR(20)
    * response_generated_by : VARCHAR(20)
    * processing_time_ms : INTEGER
    * user_reaction : VARCHAR(20)
    * effectiveness_score : DECIMAL(3,2)
    --
    + 인덱스: idx_user_id_type
    + 인덱스: idx_sent_at
    + 인덱스: idx_delivery_status
    + 인덱스: idx_effectiveness
  }

  entity "claude_api_usage" as claude_api_usage {
    * id : BIGINT <<PK>>
    --
    * request_id : VARCHAR(50)
    * user_id : VARCHAR(50)
    * api_endpoint : VARCHAR(100)
    * request_type : VARCHAR(50)
    * input_tokens : INTEGER
    * output_tokens : INTEGER
    * cost_usd : DECIMAL(10,6)
    * response_time_ms : INTEGER
    * success : BOOLEAN
    * error_message : TEXT
    * created_at : TIMESTAMP
    --
    + 인덱스: idx_user_id_date
    + 인덱스: idx_request_type
    + 인덱스: idx_success
    + 인덱스: idx_cost
  }

  note right of chat_session
    **AI 채팅 세션 관리**
    • 사용자별 대화 컨텍스트 유지
    • 세션별 상태 관리 (활성/비활성/만료)
    • 컨텍스트 정보로 개인화 대화
    • 자동 만료 기능 (24시간)
  end note

  note right of chat_message
    **채팅 메시지 저장**
    • 사용자와 AI 간 모든 대화 기록
    • 메시지 순서 보장
    • 민감정보 플래그 관리
    • Claude API 토큰 사용량 추적
  end note

  note right of analysis_result
    **AI 분석 결과 저장**
    • 건강 진단, 미션 추천 등 분석 결과
    • 신뢰도 점수로 품질 관리
    • 소스 데이터 해시로 중복 방지
    • Claude 모델 버전별 성능 추적
  end note

  note right of notification_log
    **알림 발송 이력**
    • 축하, 독려 메시지 발송 기록
    • 사용자 반응 및 효과성 측정
    • 개인화 알림 성능 분석
    • A/B 테스트 결과 수집
  end note

  note right of claude_api_usage
    **Claude API 사용량 추적**
    • API 호출별 비용 및 성능 모니터링
    • 토큰 사용량 기반 과금 관리
    • 에러 발생 패턴 분석
    • 사용자별 API 사용 통계
  end note
}

package "관계 정의" as relationships {
  chat_session ||--o{ chat_message : session_id
  chat_session }o--|| analysis_result : 분석_요청
  notification_log }o--|| analysis_result : 알림_생성
  claude_api_usage }o--|| analysis_result : API_호출
  claude_api_usage }o--|| chat_message : API_호출
  
  note as n1
    **외래키 관계**
    chat_messages.session_id → chat_sessions.session_id
    
    **논리적 관계**
    • User Service users ↔ chat_sessions (사용자별 채팅)
    • Goal Service missions ↔ notification_logs (미션별 알림)
    • Health Service checkups ↔ analysis_results (건강 분석)
    
    **참조 무결성**
    • CASCADE 삭제 (세션 삭제 시 메시지도 삭제)
    • 사용자 ID는 User Service와 일관성 유지
    • 미션 ID는 Goal Service와 연동
    
    **데이터 일관성**
    • 세션별 메시지 순서 보장
    • API 사용량과 실제 호출 일치
    • 알림 발송 성공/실패 상태 추적
  end note
}

package "데이터 타입 및 제약조건" as constraints {
  note as n2
    **chat_sessions 제약조건**
    • session_id: UUID 형태, PRIMARY KEY
    • user_id: User Service와 일치, NOT NULL
    • status: 'ACTIVE', 'INACTIVE', 'EXPIRED', 'TERMINATED'
    • session_type: 'HEALTH_CONSULTATION', 'GENERAL_CHAT', 'MISSION_GUIDANCE'
    • message_count: 0 이상, 최대 100개 메시지
    • expires_at: created_at + 24시간
    
    **chat_messages 제약조건**
    • message_id: UUID 형태, PRIMARY KEY
    • role: 'USER', 'ASSISTANT', 'SYSTEM'
    • content: 최대 10,000자
    • message_order: 세션 내 순차 증가
    • token_count: 0 이상
    • response_time_ms: 0 이상
    
    **analysis_results 제약조건**
    • analysis_type: 'HEALTH_DIAGNOSIS', 'MISSION_RECOMMENDATION', 'RISK_ASSESSMENT'
    • confidence: 0.0000~1.0000 범위
    • result: 최대 50,000자
    • source_data_hash: SHA-256 해시값
    • claude_model_version: 'claude-3-sonnet', 'claude-3-opus' 등
    
    **notification_logs 제약조건**
    • notification_type: 'CELEBRATION', 'ENCOURAGEMENT', 'REMINDER', 'ACHIEVEMENT'
    • delivery_status: 'SENT', 'DELIVERED', 'FAILED', 'PENDING'
    • response_generated_by: 'CLAUDE_AI', 'TEMPLATE', 'FALLBACK'
    • user_reaction: 'POSITIVE', 'NEGATIVE', 'NEUTRAL', 'NO_RESPONSE'
    • effectiveness_score: 0.00~5.00 범위
    
    **claude_api_usage 제약조건**
    • request_type: 'CHAT', 'ANALYSIS', 'RECOMMENDATION', 'NOTIFICATION'
    • input_tokens: 0 이상
    • output_tokens: 0 이상
    • cost_usd: 0.000001 이상 (최소 과금 단위)
    • success: 성공/실패 여부
  end note
}

package "AI 모델 및 프롬프트 관리" as ai_models {
  note as n3
    **Claude AI 모델별 특성**
    
    **claude-3-sonnet (기본 모델)**
    • 건강 상담 및 일반 채팅
    • 비용 효율적, 응답 속도 빠름
    • 토큰당 비용: $0.003 (input), $0.015 (output)
    
    **claude-3-opus (고급 모델)**
    • 복잡한 건강 분석 및 진단
    • 높은 정확도, 상세한 분석
    • 토큰당 비용: $0.015 (input), $0.075 (output)
    
    **프롬프트 최적화**
    • 건강 상담: 의료진 톤앤매너 적용
    • 미션 추천: 개인화 요소 강조
    • 독려 메시지: 동기부여 심리학 적용
    • 축하 메시지: 긍정적 감정 표현
    
    **컨텍스트 관리**
    • 최근 10개 메시지 유지
    • 사용자 프로필 정보 포함
    • 건강 상태 요약 정보 제공
    • 이전 분석 결과 참조
  end note
}

package "성능 및 운영 고려사항" as performance {
  note as n4
    **인덱스 전략**
    • chat_sessions: (user_id, status) 복합 인덱스
    • chat_messages: (session_id, message_order) 복합 인덱스
    • analysis_results: (user_id, analysis_type, created_at) 복합 인덱스
    • notification_logs: (user_id, sent_at) 복합 인덱스
    • claude_api_usage: (user_id, DATE(created_at)) 복합 인덱스
    
    **파티셔닝**
    • chat_messages: created_at 기준 월별 파티셔닝
    • claude_api_usage: created_at 기준 월별 파티셔닝
    • notification_logs: sent_at 기준 월별 파티셔닝
    
    **캐싱 전략**
    • 활성 채팅 세션: Redis 캐싱 (30분)
    • 최근 분석 결과: Redis 캐싱 (1시간)
    • Claude API 응답: Redis 캐싱 (10분)
    • 자주 사용되는 프롬프트: Redis 캐싱 (24시간)
    
    **비용 최적화**
    • 중복 분석 요청 캐싱으로 API 호출 최소화
    • 토큰 사용량 모니터링 및 알림
    • 모델별 비용 효율성 분석
    • 배치 처리로 API 호출 효율화
    
    **모니터링 지표**
    • 일일 Claude API 비용
    • 평균 응답 시간
    • API 성공률
    • 사용자별 토큰 사용량
    • 분석 결과 신뢰도 분포
  end note
}

package "데이터 보안 및 개인정보 보호" as security {
  note as n5
    **개인정보 보호**
    • 채팅 내용 중 민감정보 자동 마스킹
    • 의료 정보 포함 메시지 암호화 저장
    • 사용자 식별 정보와 채팅 내용 분리
    • 90일 경과 채팅 기록 자동 삭제
    
    **AI 윤리 및 안전**
    • 의료 조언 범위 제한 명시
    • 응급 상황 감지 시 안내 메시지
    • 편향성 방지를 위한 프롬프트 검증
    • 부적절한 응답 필터링
    
    **API 보안**
    • Claude API 키 암호화 저장
    • API 호출 시 Rate Limiting 적용
    • 요청/응답 내용 로깅 (개인정보 제외)
    • 이상 사용 패턴 모니터링
    
    **감사 및 추적**
    • 모든 AI 분석 결과 이력 보관
    • 의료 관련 분석 시 추가 검증
    • 사용자 신고 시 조치 이력 관리
    • 정기적인 AI 응답 품질 검토
    
    **규정 준수**
    • 의료기기법 비대상 확인
    • 개인정보보호법 준수
    • AI 윤리 가이드라인 적용
    • 의료 광고 규제 준수
  end note
}